package com.harmony.pilot.completion.service;

import com.harmony.pilot.common.dto.CodeContext;
import com.harmony.pilot.common.dto.Location;

import java.util.List;

/**
 * 代码导航服务接口
 * 提供Go to Definition、Find References等功能
 */
public interface NavigationService {
    
    /**
     * 跳转到定义
     * 
     * @param symbol 符号名称（函数、类、变量等）
     * @param context 代码上下文
     * @return 定义位置，如果未找到返回null
     */
    Location goToDefinition(String symbol, CodeContext context);
    
    /**
     * 查找所有引用
     * 
     * @param symbol 符号名称
     * @param context 代码上下文
     * @return 引用位置列表
     */
    List<Location> findReferences(String symbol, CodeContext context);
    
    /**
     * 查找符号实现
     * 
     * @param symbol 符号名称
     * @param context 代码上下文
     * @return 实现位置列表
     */
    List<Location> findImplementations(String symbol, CodeContext context);
    
    /**
     * 符号搜索
     * 
     * @param query 搜索查询
     * @param projectRoot 项目根目录
     * @param maxResults 最大结果数
     * @return 符号列表
     */
    List<SymbolInfo> searchSymbols(String query, String projectRoot, int maxResults);
    
    /**
     * 符号信息
     */
    class SymbolInfo {
        private String name;
        private String qualifiedName;
        private String kind;  // Function, Class, Variable, etc.
        private Location location;
        private String filePath;
        
        // Getters and Setters
        public String getName() { return name; }
        public void setName(String name) { this.name = name; }
        
        public String getQualifiedName() { return qualifiedName; }
        public void setQualifiedName(String qualifiedName) { this.qualifiedName = qualifiedName; }
        
        public String getKind() { return kind; }
        public void setKind(String kind) { this.kind = kind; }
        
        public Location getLocation() { return location; }
        public void setLocation(Location location) { this.location = location; }
        
        public String getFilePath() { return filePath; }
        public void setFilePath(String filePath) { this.filePath = filePath; }
    }
}

